package com.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

/**
 * jdbc连接mysql数据库的抽象工具类
 * 
 */
public abstract class BaseDao {
	// 固定的数据库连接
	//数据库驱动
	private static String DRIVER = "com.mysql.jdbc.Driver";
	// 数据库的URL
	private static String URL = "jdbc:mysql://localhost:3306/myweb2";
	// 数据库的用户名
	private static String USERNAME = "root";
	// 数据库的密码
	private static String PWD = "root";
	
	//连接池对象
	private static DataSource ds;
	static{
		try {
			//创建上下文对象
			Context ct=new InitialContext();
			
			/**
			 * 通过上下文对象查找tomcat的conf配置文件目录下的context.xml文件中的Resource元素来获取数据据库连接的数据源
			 * （java:comp/env：代表tomcat的conf配置文件目录）
			 */
			ds=(DataSource) ct.lookup("java:comp/env/jdbc/myweb2");
		} catch (NamingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	/**
	 * 利用tomcat连接池获取mysql数据库连接
	 */
	public Connection getConnection() {
		// 数据库连接对象
		Connection conn = null;
		try {
			// 通过数据源对象连接数据库
			conn = ds.getConnection();

			System.out.println("【jdbc】连接成功");
		} catch (SQLException e) {
			System.out.println("【jdbc】数据库连接失败");
			e.printStackTrace();
		}
		return conn;
	}
	/**
	 * 获取mysql的数据库连接
	 * */
	public Connection getConnection2() {
		// 数据库连接对象
		Connection conn = null;
		try {
			// 加载jdbc驱动
			Class.forName(DRIVER);
			// 连接数据库
			conn = (Connection) DriverManager.getConnection(URL, USERNAME, PWD);

			System.out.println("【jdbc】连接成功");
		} catch (ClassNotFoundException e) {
			System.out.println("【jdbc】jdbc驱动加载失败");
			e.printStackTrace();
		} catch (SQLException e) {
			System.out.println("【jdbc】数据库连接失败");
			e.printStackTrace();
		}
		return conn;
	}

	/**
	 * 此方法执行所有的update、delete、insert语句 [注意]执行此方法前需要先调用获得Connection连接
	 * 
	 * @param sql
	 *            :要执行的sql语句
	 * @param obj
	 *            :存放sql语句中的参数的数组，sql语句中是"?"的部分
	 * 
	 * @return 类型:int 描述:返回影响的数据条数
	 */
	public int exeUpdate(String sql, Object[] obj) {
		// 数据库连接对象
		Connection conn = this.getConnection();
		// 预编译处理对象
		PreparedStatement ps = null;
		// 记录影响的数据条数
		int issuccess = -1;
		try {
			// 预处理sql语句
			ps = conn.prepareStatement(sql);
			// 写入参数
			if(obj!=null){
				for (int i = 0; i < obj.length; i++) {
					ps.setObject(i + 1, obj[i]);
				}
			}
			// 执行sql语句并获取执行sql语句后影响的数据条数
			issuccess = ps.executeUpdate();

			if (issuccess > 0) {
				System.out.println("【jdbc】数据更新成功");
			} else {
				System.out.println("【jdbc】数据更新失败");
			}
		} catch (SQLException e) {
			System.out.println("【jdbc】数据更新失败");
			e.printStackTrace();
		} finally {
			this.closeAll(null, ps, conn);
		}
		return issuccess;
	}

	/**
	 * 此方法用来关闭工具类内的相关数据库连接
	 * 
	 * @param rs
	 *            结果集对象
	 * @param ps
	 *            预编译执行对象
	 * @param conn
	 *            数据库连接对象
	 */
	public void closeAll(ResultSet rs, Statement ps, Connection conn) {
		try {
			// 如果结果集对象不为空，关闭结果集对象
			if (rs != null)
				rs.close();
			// 如果执行对象不为空，关闭预编译执行对象
			if (ps != null)
				ps.close();
			// 如果连接不为空，关闭连接对象
			if (conn != null)
				conn.close();
			System.out.println("【jdbc】连接关闭成功");
		} catch (SQLException e) {
			System.out.println("【jdbc】连接关闭失败");
			e.printStackTrace();
		} finally {
			System.out.println("---------------------------------------");
		}
	}
}
